package com.cuz.for2024;

public class T36 {
    public static void main(String[] args) {
        char[][] board = {
        new char[]{'5', '3', '.',  '.', '7', '.',  '.', '.', '.'},
        new char[]{'6', '.', '.',  '1', '9', '5',  '.', '.', '.'},
        new char[]{'.', '9', '8',  '.', '.', '.',  '.', '6', '.'},

        new char[]{'8', '.', '.',  '.', '6', '.',  '.', '.', '3'},
        new char[]{'4', '.', '.',  '8', '.', '3',  '.', '.', '1'},
        new char[]{'7', '.', '.',  '.', '2', '.',  '.', '.', '6'},

        new char[]{'.', '6', '.',  '.', '.', '.',  '2', '8', '.'},
        new char[]{'.', '.', '.',  '4', '1', '9',  '.', '.', '5'},
        new char[]{'.', '.', '.',  '.', '8', '.',  '.', '7', '9'}
        };
        System.out.println(new T36().isValidSudoku(board));
    }

    public boolean isValidSudoku(char[][] board) {
        Helper h = new Helper();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                char c = board[i][j];
                if (c == '.') {
                    continue;
                }
                int val = c - '1';
                if (h.error(val, i, j)) {
                    return false;
                }
                h.rocord(val, i, j);
            }
        }
        return true;
    }

    static class Helper {
        private boolean[][] row = new boolean[9][9];
        private boolean[][] col = new boolean[9][9];
        private boolean[][] mix = new boolean[9][9];

        public void recordRow(int val, int rowIndex) {
            row[rowIndex][val] = true;
        }

        public void recordCol(int val, int colIndex) {
            col[colIndex][val] = true;
        }

        public void recordMix(int val, int x, int y) {
            int r = x / 3;
            int c = y / 3;
            int finnalIndex = r * 3 + c;
            mix[finnalIndex][val] = true;
        }

        public void rocord(int val, int x, int y) {
            recordRow(val, x);
            recordCol(val, y);
            recordMix(val, x, y);
        }

        public boolean error(int val, int x, int y) {
            if (row[x][val]) {
                return true;
            }
            if (col[y][val]) {
                return true;
            }
            int r = x / 3;
            int c = y / 3;
            int finnalIndex = r * 3 + c;
            if (mix[finnalIndex][val]) {
                return true;
            }
            return false;
        }
    }
}
